﻿using System;
using System.Globalization;

namespace Hxsoft
{
	/// <summary>
	/// 时间扩展类。
	/// </summary>
	public static partial class DateTimeExtensions
	{
		/// <summary>
		/// 解析一个字符串为时间值，如果解析失败则返回 null。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <returns>解析后的可空型的时间值。</returns>
		public static DateTime? ParseOrNull(string s)
		{
			DateTime result;
			if (TryParse(s, out result))
				return result;
			return null;
		}

		/// <summary>
		/// 解析一个字符串为时间值，如果解析失败则返回 null。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <param name="provider">一个 IFormatProvider 对象，提供有关 s 的区域性特定的格式设置信息。</param>
		/// <param name="styles">DateTimeStyles 值的按位组合，指示 s 允许使用的格式。一个用来指定的典型值为 None。</param>
		/// <returns>解析后的可空型的时间值。</returns>
		public static DateTime? ParseOrNull(string s, IFormatProvider provider, DateTimeStyles styles)
		{
			DateTime result;
			if (TryParse(s, provider, styles, out result))
				return result;
			return null;
		}




		/// <summary>
		/// 解析一个字符串为时间值，如果解析失败则返回默认值。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <returns>解析后的时间值。</returns>
		public static DateTime ParseOrDefault(string s)
		{
			return ParseOrDefault(s, DateTime.Now);
		}

		/// <summary>
		/// 解析一个字符串为时间值，如果解析失败则返回默认值。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <param name="defaultValue">解析失败时的默认值。</param>
		/// <returns>解析后的时间值。</returns>
		public static DateTime ParseOrDefault(string s, DateTime defaultValue)
		{
			DateTime result;
			if (TryParse(s, out result))
				return result;
			return defaultValue;
		}

		/// <summary>
		/// 解析一个字符串为时间值，如果解析失败则返回默认值。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <param name="provider">一个 IFormatProvider 对象，提供有关 s 的区域性特定的格式设置信息。</param>
		/// <param name="styles">DateTimeStyles 值的按位组合，指示 s 允许使用的格式。一个用来指定的典型值为 None。</param>
		/// <returns>解析后的时间值。</returns>
		public static DateTime ParseOrDefault(string s, IFormatProvider provider, DateTimeStyles styles)
		{
			return ParseOrDefault(s, provider, styles, DateTime.Now);
		}

		/// <summary>
		/// 解析一个字符串为时间值，如果解析失败则返回默认值。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <param name="provider">一个 IFormatProvider 对象，提供有关 s 的区域性特定的格式设置信息。</param>
		/// <param name="styles">DateTimeStyles 值的按位组合，指示 s 允许使用的格式。一个用来指定的典型值为 None。</param>
		/// <param name="defaultValue">解析失败时的默认值。</param>
		/// <returns>解析后的时间值。</returns>
		public static DateTime ParseOrDefault(string s, IFormatProvider provider, DateTimeStyles styles, DateTime defaultValue)
		{
			DateTime result;
			if (TryParse(s, provider, styles, out result))
				return result;
			return defaultValue;
		}




		/// <summary>
		/// 将一个对象转换为整型值，如果转换失败则返回默认值。
		/// </summary>
		/// <param name="from">进行转换的对象。</param>
		/// <returns>转换后的整型值。</returns>
		public static DateTime ConvertFromOrDefault(object from)
		{
			return ConvertFromOrDefault(from, DateTime.Now);
		}

		/// <summary>
		/// 将一个对象转换为整型值，如果转换失败则返回默认值。
		/// </summary>
		/// <param name="from">进行转换的对象。</param>
		/// <param name="defaultValue">转换失败时的默认值。</param>
		/// <returns>转换后的整型值。</returns>
		public static DateTime ConvertFromOrDefault(object from, DateTime defaultValue)
		{
			return from == null ? defaultValue : (DateTime)from;
		}
	}
}